import sqlite3, { Database, RunResult } from 'sqlite3';

// SQLite 工具类，封装数据库连接、增删改查等操作
class SQLiteUtils {
  private db: Database | null = null;
  constructor(private dbPath: string) {}

  // 连接数据库
  connect(): Promise<void> {
    return new Promise((resolve, reject) => {      
      this.db = new sqlite3.Database(this.dbPath, err => {
        if (err) {
          console.error('连接数据库失败:', err.message);
          reject(err);
          return;
        }
        console.log('已连接到 SQLite 数据库');
        resolve();
      });
    });
  }

  // 关闭数据库连接
  close(): Promise<void> {
    return new Promise((resolve, reject) => {
      if (!this.db) {
        resolve();
        return;
      }
      this.db.close(err => {
        if (err) {
          console.error('关闭数据库连接失败:', err.message);
          reject(err);
          return;
        }
        console.log('数据库连接已关闭');
        this.db = null;
        resolve();
      });
    });
  }

  // 执行增删改操作（无返回结果集，如 insert、update、delete）
  run(sql: string, params: any[] = []): Promise<RunResult> {
    return new Promise((resolve, reject) => {
      if (!this.db) {
        reject(new Error('数据库未连接'));
        return;
      }
      this.db.run(sql, params, function (err) {
        if (err) {
          console.error('执行 SQL 失败:', err.message);
          reject(err);
          return;
        }
        resolve(this);
      });
    });
  }

  // 查询单条数据
  get<T>(sql: string, params: any[] = []): Promise<T | null> {
    return new Promise((resolve, reject) => {
      if (!this.db) {
        reject(new Error('数据库未连接'));
        return;
      }
      this.db.get(sql, params, (err, row) => {
        if (err) {
          console.error('查询单条数据失败:', err.message);
          reject(err);
          return;
        }
        resolve(row as T);
      });
    });
  }

  // 查询多条数据
  all<T>(sql: string, params: any[] = []): Promise<T[]> {
    return new Promise((resolve, reject) => {
      if (!this.db) {
        reject(new Error('数据库未连接'));
        return;
      }
      this.db.all(sql, params, (err, rows) => {
        if (err) {
          console.error('查询多条数据失败:', err.message);
          reject(err);
          return;
        }
        resolve(rows as T[]);
      });
    });
  }

  // 初始化数据库表（这里假设创建 users 表，可根据实际需求调整）
  async initTables(): Promise<void> {
    const createTableSql = `
            CREATE TABLE IF NOT EXISTS users (
                id INTEGER PRIMARY KEY AUTOINCREMENT,
                name TEXT NOT NULL,
                email TEXT NOT NULL UNIQUE
            )
        `;
    await this.run(createTableSql);
    console.log('数据库表初始化完成');
  }
}

export default SQLiteUtils;
